#******************************
#Conception
#******************************

def name_of_fun(f):
    print f.__name__

def foo():
    print "foo()"

def create_addiction(x):
     def sum_x_y(y):
             return x + y
     return sum_x_y

sum_number = create_addiction(5)
print sum_number(10)

#exmample 1

def pokaz_wywolanie(f):
     def opakowanie(*args, **kwds):
             print 'Wywoluje:', f.__name__
             return f(*args, **kwds)
     return opakowanie

#@pokaz_wywolanie <=> fun = pokaz_wywolanie(fun)
@pokaz_wywolanie
def fun():
    print "foo()"

fun()

#example 2

def powtorz(n):
     def powtorz_nrazy(f):
             def opakowanie(*args, **kwds):
                     for i in range(n):
                             ret = f(10) #f() <=> bar(10)
                     return ret
             return opakowanie
     return powtorz_nrazy

#powtorz(4) <=> bar = powtorz(4)(bar) | powtorz(4) => powtorz_nrazy | powtorz_nrazy => opakowanie | bar() <=> opakowanie()
@powtorz(4)
def bar(arg):
    print "bar " + str(arg)

#opakowanie
bar()
